home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-01-14 | 7.4 KB | 279 lines | [TEXT/MPS ] |
- /* _________________________________________________________________________________________________________ //
- Copyright © 1991-93 Apple Computer, Inc. All rights reserved.
- Macintosh Developer Technical Support.C++ Macintosh Toolbox Framework.
- Date: Tuesday, June 2, 1992 11:53:42
- Revision comments are at the end of this file.
- ---
- TRandom is a stackbased utility class for random number generation.
- TRandomTest.cp contains the test functions for the TRandom class.
- _________________________________________________________________________________________________________ */
-
- // HEADERS
- #ifndef _RANDOM_
- #include "Random.h"
- #endif
-
- // GLOBALS
- void CalcTime(const char* string); // calculate time function
- unsigned long timeStart; // global timing
-
-
- // Test the TRandom class inside out.
-
- void main(void)
- {
- const short cARRAYSIZE = 80; // 200 is a nice size
- const long cBIGNUM = 1000; //cBIGNUM= 1000000 takes about 40 sec
- unsigned short val;
- long x;
- unsigned short array1[cARRAYSIZE],
- array2[cARRAYSIZE];
-
- InitGraf((Ptr) & qd.thePort); // Initialize grafport!
-
- // First initial quick test of the toolbox value
- qd.randSeed = TickCount();
- long xx = Random();
- cerr << "Normal Toolbox Random = " << xx << '\n';
-
-
- // 1. Create an instance of each TRandom class
- TRandom aRandom;
- val = aRandom.Next();
- cerr << "Toolbox aRandom.Next = " << val << "\n";
-
- aRandom.SetRandomGenerator(TRandom::kQUICK);
- val = aRandom.Next();
- cerr << "Quick aRandom.Next = " << val << '\n';
-
- aRandom.SetRandomGenerator(TRandom::kSHUFFLE);
- val = aRandom.Next();
- cerr << "Shuffle aRandom.Next = " << val << '\n';
-
- aRandom.SetRandomGenerator(TRandom::kPM);
- val = aRandom.Next();
- cerr << "PM aRandom.Next = " << val << '\n';
-
- // 2. Efficiency test, docBIGNUMtimes random numbers and return the time
- cerr << "Doing " << cBIGNUM << " random numbers of each class...this will take some time\n";
-
- // Toolbox Random
- aRandom.SetRandomGenerator(TRandom::kMACOS);
- GetDateTime(&timeStart);
- for (x = 0; x <= cBIGNUM; x++)
- {
- val = aRandom.Next();
- #if DEBUG
- cerr << "Toolbox Random " << x << " = " << val << '\n';
- #endif
-
- }
- CalcTime("Toolbox");
-
- // Quick Random
- aRandom.SetRandomGenerator(TRandom::kQUICK);
- GetDateTime(&timeStart);
- for (x = 0; x <= cBIGNUM; x++)
- {
- val = aRandom.Next();
- #if DEBUG
- cerr << "Quick Random " << x << " = " << val << '\n';
- #endif
-
- }
- CalcTime("Quick");
-
- // Shuffle Random
- aRandom.SetRandomGenerator(TRandom::kSHUFFLE);
- GetDateTime(&timeStart);
- for (x = 0; x <= cBIGNUM; x++)
- {
- val = aRandom.Next();
- #if DEBUG
- cerr << "Shuffle Random " << x << " = " << val << '\n';
- #endif
-
- }
- CalcTime("Shuffle");
-
- // PM Random
- aRandom.SetRandomGenerator(TRandom::kPM);
- GetDateTime(&timeStart);
- for (x = 0; x <= cBIGNUM; x++)
- {
- val = aRandom.Next();
- #if DEBUG
- cerr << "PM Random " << x << " = " << val << '\n';
- #endif
-
- }
- CalcTime("PM");
-
- // 3. Performance test, create twice the random numbers with the same
- // original seed, and compare the results, signal if they differ
-
- long definedSeed;
-
- cerr << "Performance test, create from same seed twice and compare...\n";
-
- // MACOS Random Performance test
- cerr << "MacOS Random...";
- aRandom.SetRandomGenerator(TRandom::kMACOS);
-
- aRandom.ShuffleSeed(); // get new seed
- definedSeed = aRandom.GetSeedValue(); // store it
-
- aRandom.SetSeedValue(definedSeed); // back to first seed
-
- for (x = 0; x < cARRAYSIZE; x++) // fill array1
- array1[x] = aRandom.Next();
-
- aRandom.SetSeedValue(definedSeed); // back to first seed
- for (x = 0; x < cARRAYSIZE; x++) // fill array2
- array2[x] = aRandom.Next();
-
- for (x = 0; x < cARRAYSIZE; x++)
- { // compare
- if (array1[x] != array2[x])
- {
- cerr << "problems with Toolbox values....\n";
- cerr << "x = " << x << ",array1 = " << array1[x] << ", array2 = " << array2[x] << '\n';
- }
- else
- cerr << ".";
- }
- cerr << "\n";
-
- // Quick Random Performance test
- cerr << "Quick Random...";
- aRandom.SetRandomGenerator(TRandom::kQUICK);
-
- aRandom.ShuffleSeed(); // get new seed
- definedSeed = aRandom.GetSeedValue(); // store it
-
- aRandom.SetSeedValue(definedSeed); // back to first seed
-
- for (x = 0; x < cARRAYSIZE; x++) // fill array1
- array1[x] = aRandom.Next();
-
- aRandom.SetSeedValue(definedSeed); // back to first seed
- for (x = 0; x < cARRAYSIZE; x++) // fill array2
- array2[x] = aRandom.Next();
-
- for (x = 0; x < cARRAYSIZE; x++)
- { // compare
- if (array1[x] != array2[x])
- {
- cerr << "problems with Quick values....\n";
- cerr << "x = " << x << ",array1 = " << array1[x] << ", array2 = " << array2[x] << '\n';
- }
- else
- cerr << ".";
- }
- cerr << "\n";
-
- // Shuffle Random Performance test
- cerr << "Shuffle Random...";
- TRandom rand1(TRandom::kSHUFFLE);
- TRandom rand2(TRandom::kSHUFFLE);
-
- aRandom.ShuffleSeed(); // get new seed
- definedSeed = aRandom.GetSeedValue(); // store it
-
- rand1.SetSeedValue(definedSeed); // back to first seed
-
- for (x = 0; x < cARRAYSIZE; x++) // fill array1
- array1[x] = rand1.Next();
-
- rand2.SetSeedValue(definedSeed); // back to first seed
- for (x = 0; x < cARRAYSIZE; x++) // fill array2
- array2[x] = rand2.Next();
-
- for (x = 0; x < cARRAYSIZE; x++)
- { // compare
- if (array1[x] != array2[x])
- {
- cerr << "problems with Quick values....\n";
- cerr << "x = " << x << ",array1 = " << array1[x] << ", array2 = " << array2[x] << '\n';
- }
- else
- cerr << ".";
- }
- cerr << "\n";
-
- // Park-Miller
- cerr << "PM Random...";
- aRandom.SetRandomGenerator(TRandom::kPM);
-
- aRandom.ShuffleSeed(); // get new seed
- definedSeed = aRandom.GetSeedValue(); // store it
-
- aRandom.SetSeedValue(definedSeed); // back to first seed
-
- for (x = 0; x < cARRAYSIZE; x++) // fill array1
- array1[x] = aRandom.Next();
-
- aRandom.SetSeedValue(definedSeed); // back to first seed
-
- for (x = 0; x < cARRAYSIZE; x++) // fill array2
- array2[x] = aRandom.Next();
-
- for (x = 0; x < cARRAYSIZE; x++)
- { // compare
- if (array1[x] != array2[x])
- {
- cerr << "problems with PM values....\n";
- cerr << "x = " << x << ",array1 = " << array1[x] << ", array2 = " << array2[x] << '\n';
- }
- else
- cerr << ".";
- }
- cerr << "\n";
-
- // 4. Test mutator class reference passing (syntax check)
- aRandom.SetRandomGenerator(TRandom::kMACOS).ShuffleSeed();
-
- // 5. Test of copy constructor
- cerr << "\nTest of copy constructor\n";
-
- TRandom bRandom(aRandom);
- cerr << "Seed from aRandom = " << aRandom.GetSeedValue() << "\n";
- cerr << "Seed from bRandom = " << bRandom.GetSeedValue() << "\n";
- cerr << "Rand val from aRandom = " << aRandom.Next() << "\n";
- cerr << "Rand val from bRandom = " << bRandom.Next() << "\n";
-
-
- // 6. Test of assignment operator overload
- cerr << "\nTest of assignment operator overload\n";
-
- TRandom cRandom = aRandom;
- cerr << "Seed from aRandom = " << aRandom.GetSeedValue() << "\n";
- cerr << "Seed from cRandom = " << cRandom.GetSeedValue() << "\n";
- cerr << "Rand val from aRandom = " << aRandom.Next() << "\n";
- cerr << "Rand val from cRandom = " << cRandom.Next() << "\n";
-
- cerr << "The end of the TRandom Test!\n";
- }
-
-
- void CalcTime(const char* string)
- // Calculate Time.
- {
- unsigned long totalTime, timeEnd;
-
- ::GetDateTime(&timeEnd);
- totalTime = timeEnd - timeStart;
- cerr << "Time for \t" << string << "\t= " << totalTime << '\n';
- }
-
-
- // _________________________________________________________________________________________________________ //
-
-
- /* Change History (most recent last):
- No Init. Date Comment
- 1 khs 6/2/92 New file
- 2 khs 1/7/93 Cleanup
- */
-
-